require("mysql");
var fs = require("fs");
var orm = require("orm");
var Promise = require("bluebird");
var path = require("path");

/*
	app: 应用程序环境
	config: 数据库配置
	callback: 回调
*/
function initialize(app, callback) {
  // 加载配置文件
  var config = require("config").get("db_config");

  // 从配置中获取数据库配置
  var opts = {
    protocol: config.get("protocol"),
    host: config.get("host"),
    database: config.get("database"),
    port: config.get("port"),
    user: config.get("user"),
    password: config.get("password"),
    query: { pool: true, debug: true }
  };

  console.log("数据库连接参数 %s", JSON.stringify(opts));

  // 初始化ORM模型
  app.use(
    orm.express(opts, {
      define: function(db, models, next) {
        app.db = db;
        global.database = db;

        // 获取映射文件路径
        var modelsPath = path.join(process.cwd(), "/models");

        // 读取所有模型文件
        fs.readdir(modelsPath, function(err, files) {
          // 存放所有的加载模型函数
          var loadModelAsynFns = new Array();
          // console.log("开始加载 ORM 模型层文件 ");
          for (var i = 0; i < files.length; i++) {
            var modelPath = modelsPath + "/" + files[i];
            // console.log("加载模型 %s",modelPath);
            loadModelAsynFns[i] = db.loadAsync(modelPath);
          }

          Promise.all(loadModelAsynFns)
            .then(function() {
              // console.log("ORM 模型加载完成");
              // 挂载模型集合

              for (var modelName in db.models) {
                models[modelName] = db.models[modelName];
              }
              app.models = models;
              callback(null);
              next();
            })
            .catch(function(error) {
              console.error("加载模块出错 error: " + err);
              callback(error);
              next();
            });
        });
      }
    })
  );
}

module.exports.initialize = initialize;
module.exports.getDatabase = function() {
  return global.database;
};
